import initState from './initState.js'
import compilerToFunction from './compiler/index.js'
import {mountComponent,callHook} from './lifeCycle.js'
import { mergeOptions } from './util/mergeOptions.js'
import { nextTick } from './observe/watch.js'
function init(vue){
    vue.prototype._init=function (options){
       let vm=this
       vm.$options=options
       
       //将组件中的options与mixin中的混入
       vm.$options=mergeOptions(vm.constructor.options,options)

       callHook(vm,'beforeCreate')    //  beforeCreate 生命周期
       
       //对数据初始化
       initState(vm)

       callHook(vm,'created')        //created 生命周期
     
       if(vm.$options.el){
           //编译模板
           vm.$mount(vm.$options.el)
       }
    }

    vue.prototype.$mount=function (el){
       let vm=this
       let options=vm.$options
       el=document.querySelector(el)
       vm.$el=el
       //先判断有没有写 render 函数 ，没有就判断 有没有写template ，没有就去挂载的dom元素
       if(!options.render){
          let template=options.template
          if(!template&&el){
               template=el.outerHTML   //去<div id='app'></div>的内容作为模板挂载
          }
          let render=compilerToFunction(template)   //编译模板,转成ast语法树  ast是描述html语法的  虚拟dom是描述dom结构的
          options.render=render  //渲染函数，每次数据更新都会调用
       }
      mountComponent(vm,el)  //挂载组件
    }
    vue.prototype.$nextTick=nextTick
}

export default init